package com.hw.protocol.tool.decode.hw;

import com.hw.protocol.tool.model.entity.hw.AbsFlowMeter;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

/**
 * @author : lihy
 * @date : 2023/3/22 11:23
 * description: 流量计数据解码器模板
 */
public abstract class FlowMeterDecodeTemplate {

    private AbsFlowMeter flowMeter;
    ByteBuf dataBuf;

    FlowMeterDecodeTemplate(AbsFlowMeter fm, byte[] data) {
        this.flowMeter = fm;
        this.dataBuf = Unpooled.wrappedBuffer(data);
    }

    /**
     * 设置时间（历史数据）
     */
    void setTime() {
    }

    /**
     * 设置表具类型，温度，压力，标准流量，工况流量
     */
    void setBaseData() {
        flowMeter.setMeterType(dataBuf.readShortLE());
        flowMeter.setTemperature(dataBuf.readFloatLE());
        flowMeter.setPress(dataBuf.readFloatLE());
        flowMeter.setFlux(dataBuf.readFloatLE());
        flowMeter.setRealFlux(dataBuf.readFloatLE());
    }

    /**
     * 设置标准体积
     */
    void setVolume() {
    }

    /**
     * 设置工况体积
     */
    void setRealVolume() {
    }

    /**
     * 设置压缩系数
     */
    void setRatio() {
    }

    /**
     * 设置转换因子
     */
    void setFactor() {
    }

    /**
     * 设置反向体积
     */
    void setReverseVolume() {
    }

    /**
     * 设置外接温度
     */
    void setExternalTemp() {
    }

    /**
     * 设置外接压力
     */
    void setExternalPress() {
    }

    /**
     * 设置flag
     */
    void setFlag() {
        byte[] flag = new byte[4];
        dataBuf.getBytes(dataBuf.capacity() - 4, flag);
        flowMeter.setFlag(flag);
        //bit7是否等于0
        flowMeter.setDefaultVolume(((int) flag[0] & 0x80 >> 7) == 0);
    }

    /**
     * 组装数据
     */
    public void buildObject() {
        setFlag();
        if (hisData()) {
            //历史数据
            setTime();
        }
        setBaseData();
        if (dtu50()) {
            //外供电dtu
            setVolume();
            setRealVolume();
            setRatio();
            setFactor();
        }
        if (dtu37()) {
            //带逆标况流量外供电dtu
            setVolume();
            setRealVolume();
            setReverseVolume();
        }
        if (dtu61()) {
            //电池dtu
            setVolume();
            setRealVolume();
            setExternalTemp();
            setExternalPress();
        }
        if (dtu38()) {
            //带逆标况流量电池dtu
            setVolume();
            setRealVolume();
            setReverseVolume();
            setExternalPress();
        }
        //释放内存
        dataBuf.release();
    }

    /**
     * 历史数据
     */
    boolean hisData() {
        return false;
    }

    /**
     * dtu5000/5100
     */
    boolean dtu50() {
        return false;
    }

    /**
     * dtu37768/37868
     */
    boolean dtu37() {
        return false;
    }

    /**
     * dtu6130/6131
     */
    boolean dtu61() {
        return false;
    }

    /**
     * dtu38898/38899
     */
    boolean dtu38() {
        return false;
    }
}
